// Package main 演示如何使用GORM连接MySQL数据库并进行基本查询
// 这是一个完整的、独立的示例程序，不依赖项目中的其他包
package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// main 函数演示连接数据库并执行简单查询
// 这是一个独立的示例程序，展示了GORM最基础的数据库连接和查询功能
// 与项目中的其他示例不同，这个文件不使用global包中的全局DB连接
func main() {
	// 数据库连接配置信息
	username := "root"  // MySQL用户名
	password := "root"  // MySQL密码
	host := "127.0.0.1" // 数据库主机地址，这里使用本地主机，也可替换为远程服务器地址
	port := 3306        // 数据库端口号，MySQL默认端口为3306
	Dbname := "gorm"    // 数据库名称，需要预先创建
	timeout := "10s"    // 连接超时时间，设置为10秒

	// 构造数据库连接字符串(DSN) - Data Source Name
	// 格式：username:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local&timeout=timeout
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
	// 参数说明：
	// - charset=utf8mb4: 支持完整的UTF-8字符集（包括表情符号和特殊字符）
	// - parseTime=True: 自动将数据库中的时间类型转换为Go的time.Time类型
	// - loc=Local: 设置时区为本地时区，确保时间处理正确
	// - timeout=10s: 设置连接超时时间为10秒，防止长时间等待无响应的连接

	// 使用GORM连接MySQL数据库
	// mysql.Open(dsn) 创建一个MySQL数据库驱动
	// &gorm.Config{} 提供GORM的配置选项，这里使用默认配置
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		// 如果连接失败则抛出异常
		// 在实际生产环境中，应避免使用panic，而应采用适当的错误处理机制
		// 例如：记录日志、返回错误、尝试重试等
		panic("连接数据库失败, error=" + err.Error())
	}

	// 连接成功提示
	// 打印数据库连接对象的地址，证明连接已成功建立
	fmt.Println("数据库连接成功:", db)

	// 定义用户模型结构体
	// 这里定义了一个临时的User结构体用于演示
	// 注意：与项目中的models.UserModel不同，这是为本示例独立定义的
	// 在实际项目中，模型通常会放在单独的包中（如本项目的models包）	type User struct {
		ID    int    // 用户ID，作为主键
		Name  string // 用户姓名
		Email string // 用户邮箱
	}

	// 查询所有用户数据
	// 使用Find方法查询User表中的所有记录
	// Find方法会自动构建并执行SELECT * FROM users语句
	// 将查询结果存储到userList切片中
	var userList []User	db.Find(&userList)
	fmt.Println("用户列表:", userList)
}
